"""K8s资源解析器模块"""

import json
import yaml
import os
from typing import Dict, Any, Optional, List
import logging

class ResourceParser:
    """
    K8s资源文件解析器
    支持解析YAML和JSON格式的K8s配置文件
    """
    
    def __init__(self, logger: Optional[logging.Logger] = None):
        """
        初始化解析器
        
        Args:
            logger: 日志记录器，可选
        """
        self.logger = logger or logging.getLogger(__name__)
    
    def parse_file(self, file_path: str) -> Dict[str, Any]:
        """
        解析指定路径的文件内容
        
        Args:
            file_path: 待解析文件路径
            
        Returns:
            解析后的字典对象
            
        Raises:
            FileNotFoundError: 文件不存在时
            ValueError: 文件格式不支持或解析失败时
        """
        if not os.path.isfile(file_path):
            error_msg = f"文件不存在: {file_path}"
            self.logger.error(error_msg)
            raise FileNotFoundError(error_msg)
        
        file_ext = os.path.splitext(file_path)[1].lower()
        
        try:
            with open(file_path, 'r', encoding='utf-8') as f:
                content = f.read()
                
            if not content.strip():
                self.logger.warning(f"文件内容为空: {file_path}")
                return {}
            
            # 根据文件扩展名选择解析方法
            if file_ext in ['.yaml', '.yml']:
                return self._parse_yaml(content, file_path)
            elif file_ext == '.json':
                return self._parse_json(content, file_path)
            else:
                # 尝试自动检测格式
                return self._auto_detect_and_parse(content, file_path)
                
        except Exception as e:
            error_msg = f"解析文件失败: {file_path}, 原因: {str(e)}"
            self.logger.error(error_msg)
            raise ValueError(error_msg) from e
    
    def _parse_yaml(self, content: str, file_path: str) -> Dict[str, Any]:
        """解析YAML格式内容，支持多文档"""
        try:
            self.logger.debug(f"以YAML格式解析文件: {file_path}")
            # 检查是否是多文档YAML
            if '---' in content:
                self.logger.debug(f"检测到多文档YAML: {file_path}")
                docs = list(yaml.safe_load_all(content))
                # 只返回第一个非空文档
                for doc in docs:
                    if doc:
                        return doc
                return {}
            else:
                return yaml.safe_load(content) or {}
        except yaml.YAMLError as e:
            error_msg = f"YAML解析错误: {file_path}, 原因: {str(e)}"
            self.logger.error(error_msg)
            raise ValueError(error_msg) from e
    
    def _parse_json(self, content: str, file_path: str) -> Dict[str, Any]:
        """解析JSON格式内容"""
        try:
            self.logger.debug(f"以JSON格式解析文件: {file_path}")
            return json.loads(content) or {}
        except json.JSONDecodeError as e:
            error_msg = f"JSON解析错误: {file_path}, 原因: {str(e)}"
            self.logger.error(error_msg)
            raise ValueError(error_msg) from e
    
    def _auto_detect_and_parse(self, content: str, file_path: str) -> Dict[str, Any]:
        """自动检测内容格式并解析"""
        # 首先尝试解析成JSON
        try:
            result = json.loads(content)
            self.logger.info(f"自动检测到JSON格式: {file_path}")
            return result or {}
        except json.JSONDecodeError:
            pass  # 解析失败，继续尝试YAML格式
        
        # 尝试解析成YAML
        try:
            # 检查是否是多文档YAML
            if '---' in content:
                self.logger.debug(f"检测到多文档YAML: {file_path}")
                docs = list(yaml.safe_load_all(content))
                # 只返回第一个非空文档
                for doc in docs:
                    if doc:
                        return doc
                return {}
            else:
                result = yaml.safe_load(content)
                self.logger.info(f"自动检测到YAML格式: {file_path}")
                return result or {}
        except yaml.YAMLError:
            pass  # 解析失败
        
        # 两种格式都解析失败
        error_msg = f"无法识别文件格式: {file_path}, 既不是有效的YAML也不是有效的JSON"
        self.logger.error(error_msg)
        raise ValueError(error_msg)